#include "jwt.h"

#include <chrono>

// 定义并初始化静态成员secretKey
const std::string Jwt::secretKey = "839e0344d28cdeba29fd4d7327212d6a1b29037b9c5c8f55c7577b703eede69c";
// 定义并初始化静态成员defaultExpireDays
const int Jwt::defaultExpireDays = 7;
// 定义并初始化静态成员issuer
const std::string Jwt::issuer = "ljj";
// 定义并初始化静态成员type
const std::string Jwt::type = "JWS";


// 创建一个新的JWT令牌，其中包含一个userId声明和一个exp声明，表示令牌的过期时间
[[maybe_unused]] std::string Jwt::createToken(const Json::Value &json) {
    // 创建一个新的JWT令牌
    auto token = jwt::create();
    // 设置令牌的发行者
    token.set_issuer(issuer);
    // 设置令牌的类型
    token.set_type(type);
    // 设置令牌的发行时间
    token.set_issued_at(std::chrono::system_clock::now());
    // 设置令牌的过期时间
    token.set_expires_at(std::chrono::system_clock::now() + std::chrono::hours(24 * defaultExpireDays));

    // 遍历json对象的所有成员，并将它们添加到令牌的负载声明中
    for (const auto &key: json.getMemberNames()) {
        // 创建一个新的声明
        jwt::claim value(json[key].asString());
        // 将声明添加到令牌的负载声明中
        token.set_payload_claim(key, value);
    }

    // 对令牌进行签名，并返回签名后的令牌
    return token.sign(jwt::algorithm::hs256{secretKey});
}

// 解码给定的JWT令牌，并返回userId声明的值
[[maybe_unused]] Json::Value Jwt::decodeToken(const std::string &token) {
    // 创建一个新的验证器
    auto verifier = jwt::verify()
            // 允许使用HS256算法
            .allow_algorithm(jwt::algorithm::hs256{secretKey})
                    // 设置发行者
            .with_issuer(issuer);

    // 解码令牌
    auto decodedToken = jwt::decode(token);

    // 检查令牌是否过期
    auto expClaim = decodedToken.get_expires_at();
    if (std::chrono::system_clock::now() > expClaim) {
        // 如果令牌过期，返回一个Json::nullValue
        return Json::nullValue;
    }

    // 验证令牌
    verifier.verify(decodedToken);

    // 创建一个新的Json::Value对象，用于存储令牌的所有负载声明
    Json::Value result;
    for (const auto &[key, value] : decodedToken.get_payload_claims()) {
        result[key] = value.as_string();
    }

    // 返回包含令牌所有负载声明的Json::Value对象
    return result;
}